\documentclass[a4paper]{ctexart}
\usepackage[hidelinks]{hyperref}%目录
\usepackage{listing}
\usepackage{xcolor}
\usepackage{xeCJK} %导入这个宏包，就可以支持中文
\usepackage{cite}%文献引用
\usepackage{graphicx}
\usepackage{subcaption} 
\usepackage{float}
\usepackage{amsthm,amsmath,amssymb,amsfonts}%数学命题，数学字母，排版
\usepackage[a4paper,left=25.4mm,right=25.4mm,top=29.8mm,bottom=29.8mm]{geometry}

\pagestyle{myheadings}
\numberwithin{equation}{section}%以section编号equation

%数学命题环境定义 
%证明环境直接用proof
\theoremstyle{plain} \newtheorem{thm}{定理}[section]
\theoremstyle{plain} \newtheorem*{lemma}{引理}
\theoremstyle{plain} \newtheorem*{prop}{prop}
\theoremstyle{plain} \newtheorem*{property}{性质}
\theoremstyle{definition} \newtheorem*{define}{定义}
\theoremstyle{plain} \newtheorem*{cor}{cor}
\theoremstyle{plain} \newtheorem*{eg}{例}
\theoremstyle{plain} \newtheorem*{pf}{证明}
\theoremstyle{plain} \newtheorem*{hwk}{题目}


\title{Project}
\author{陈宇涛，强数2101,3210102287}


\begin{document}
\maketitle
\section{项目作业框架}
\begin{verbatim}
Spline.h:
class Function;能够计算一个点的值，导数值，二阶导。
class Poly;多项式类，给出在某一点x_0的系数可以得到多项式。
class PPSpline;完成了线性插值和三次插值，有两种传入方式：分别是传入vector<double>knots
和vector<double> f_values,直接传入Function计算f_values也可以以及边界条件。
class BSpline_base;可以给knots从而得到n阶B样条基函数
class BSpline2;cardinal quadratic插值
class BSpline3;complete边界条件的三次多项式插值

Curve.h:
我个人感觉不要在PPSpline中用模板类因为一维插值和多维插值不同,一维传入的是knots和f_values,
多维给的是vector<vector<double>> f_values再计算累计弦长,然后对于每一个维度都进行一维插值，
两者还是有很多不同之处，更像是继承或者调用的关系。

iofile.h
为了将输出的值放到python画图而写的
\end{verbatim}



\section{测试说明}
运行$make run$可以得到各个题目的插值结果,而后将结果输出到txt文件中,
再运行plotallall.py就可以看到所有的插值图像




\section{作业内容}
\begin{hwk}[A]
    \[
        f(x) = \frac{1}{1+25x^2},~~x\in[-1,1]
    \]
    等间隔选取了${N_i=2^{i}*5+1}$个结点,而后使用PPSpline插值(边界条件为cubic),
    可以发现随着小区间数量或者插值点数量增加，最大误差在逐渐减小趋于0.
    从图像可知，随着插值节点数量增多，曲线对$f(x)$的拟合越来越好,这样的插值有效避免了Runge 现象.
    计算每一个小区间中心误差取最大值得到$N=N_i\mbox{时}errors(N_i)$如下
    \begin{table}[!ht]
        \centering
        \begin{tabular}{|l|l|l|l|l|l|l|}
        \hline
            $N_i$  & 6 &11 & 21 & 41& 81 \\ \hline
            errors     & 0.423482  & 0.0205306 & 0.00316894 & 0.000275356 & 1.609e-05\\ \hline
            ln(errors) & -0.8592   & -3.88590 & -5.7543581 & -8.1974457 & -11.0373126 \\ \hline
        \end{tabular}
    \end{table}

    \begin{figure}[H]
        \centering  
        \includegraphics[width=0.8\textwidth]{A_errors.png}  
        \caption{拟合误差与插值点数量关系}  
    \end{figure} 

    \begin{figure}[H]
        \centering  
        \includegraphics[width=0.8\textwidth]{A_poly.png}  
        \caption{PPform拟合$1/1+25x^2$}  
    \end{figure}
\end{hwk}


\clearpage

\begin{hwk}[C,D]
    \[
        f(x) = \frac{1}{1+x^2},~~x\in[-5,5]
    \]
    我们使用${t_i=-6+i,~i=1,\cdots,11}$和${n_i=i-\frac{11}{2}~,i=1,\cdots,10}$作为结点来
    分别完成cardinal cubic(complete)插值和cardinal quadratic插值.
    在表格中有一些数据接近机器精度是因为这些点的函数值是插值节点，由于机器精度会有一些误差。
    像quadratic中x=-3.5没有误差,但是x=0.5也是插值结点却有$10^(-16)$误差.
    整体上还是三次B样条插值更加好，像在插值点上三次插值误差为0，非插值点上误差在$10^(-3)$范围内，
    但是二次插值结果在0处居然有0.12的大误差。
    \begin{verbatim}  
        error of cardinal quadratic:
        x = -3.5 : error = 0
        x = -3 : error = 0.00141838
        x = -0.5 : error = 1.11022e-16
        x = 0 : error = 0.120238
        x = 0.5 : error = 1.11022e-16
        x = 3 : error = 0.00141838
        x = 3.5 : error = 0

        error of cardinal cubic:
        x = -3.5 : error = 0.000505852
        x = -3 : error = 0
        x = -0.5 : error = 0.0205266
        x = 0 : error = 0
        x = 0.5 : error = 0.0205266
        x = 3 : error = 0
        x = 3.5 : error = 0.000505852
    \end{verbatim}
\begin{figure}[H]
    \centering  
    \includegraphics[width=0.8\textwidth]{C_poly.png}  
    \caption{BBform拟合$1/1+x^2$}
\end{figure} 

\end{hwk}


\clearpage

\begin{hwk}[E]
    \[
        x^2+(\frac{3}{2}y-\sqrt{|x|})^2=3
    \]
    化为参数方程后
    \begin{align*}
        x & = \sqrt{3} \sin (\theta) \\
        y & = \frac{2}{3} (\sqrt{\sqrt{3}|\sin (\theta)|} + \sqrt{3}\cos \theta)\\
    \end{align*}
    对于这个参数方程我们发现$x'(\theta) \sqrt{3}\cos(\theta),
    ~y'(\theta)=\frac{\sqrt{3}}{3}\frac{\cos(\theta)}{\sqrt{\sqrt{3}|\sin(\theta)|}}-
    \frac{2}{3}\sqrt{3}\sin(\theta)$有$\theta = 0,\pi$两个奇点,也就是心形状线关于y轴的两个交点处，
    所以很难直接计算标准弧长参数,我们在这两个点附近多增加一些结点再用近似弦长来使得图形更加准确.这两个点的导数值理论上
    是无穷,最好的边界条件肯定是natural,或者cubic作为比较。

    从图像可以发现，随着插值节点增多，插值对于Heart曲线的拟合形态逐渐变好，特别是奇点附近。
    但是在这两个点的$y'$趋近于无穷大，由于机器有最大上界所以拟合还是不够精确。

    \begin{figure}[H]
        \centering  
        \begin{minipage}{0.5\textwidth}  
            \centering  
            \includegraphics[width=0.8\linewidth]{cubic_10.png}  
            \caption{N=10, cubic}  
        \end{minipage}%  
        \begin{minipage}{0.5\textwidth}  
            \centering  
            \includegraphics[width=0.8\linewidth]{cubic_40.png}  
            \caption{N=40, cubic}  
        \end{minipage}   
    \end{figure}  

    \begin{figure}[H]
        \centering  
        \includegraphics[width=0.6\textwidth]{cubic_160.png}  
        \caption{N=160, cubic}  
    \end{figure} 


    \begin{figure}[H]
        \centering  
        \begin{minipage}{0.5\textwidth}  
            \centering  
            \includegraphics[width=0.8\linewidth]{natural_10.png}  
            \caption{N=10, natural}  
        \end{minipage}%  
        \begin{minipage}{0.5\textwidth}  
            \centering  
            \includegraphics[width=0.8\linewidth]{natural_40.png}  
            \caption{N=40, natural}  
        \end{minipage}   
    \end{figure} 

    \begin{figure}[H]
        \centering  
        \includegraphics[width=0.6\textwidth]{natural_160.png}  
        \caption{N=160, natural}  
    \end{figure} 



\end{hwk}

\end{document}

